home *** CD-ROM | disk | FTP | other *** search
- Name
-
- SGIS_multisample
-
- Name Strings
-
- GL_SGIS_multisample
- GLX_SGIS_multisample
-
- Version
-
- $Date: 1995/09/30 02:31:53 $ $Revision: 1.1 $
-
- Number
-
- 25
-
- Dependencies
-
- SGIX_pixel_texture affects the definition of this extension.
-
- Overview
-
- This extension provides a mechanism to antialias all GL primitives:
- points, lines, polygons, bitmaps, and images. The technique is to
- sample all primitives multiple times at each pixel. The color sample
- values are resolved to a single, displayable color each time a pixel
- is updated, so the antialiasing appears to be automatic at the
- application level. Because each sample includes depth and stencil
- information, the depth and stencil functions perform equivalently
- to the single-sample mode.
-
- An additional buffer, called the multisample buffer, is added to
- the framebuffer. Pixel sample values, including color, depth, and
- stencil values, are stored in this buffer. When the framebuffer
- includes a multisample buffer, it does not also include separate
- depth or stencil buffers, even if the multisample buffer does not
- store depth or stencil values. Color buffers (left/right, front/
- back, and aux) do coexist with the multisample buffer, however.
-
- Multisample antialiasing is most valuable for rendering polygons,
- because it requires no sorting for hidden surface elimination, and
- it correctly handles adjacent polygons, object silhouettes, and
- even intersecting polygons. If only points or lines are being
- rendered, the "smooth" antialiasing mechanism provided by the base
- GL may result in a higher quality image. This extension is designed
- to allow multisample and smooth antialiasing techniques to be
- alternated during the rendering of a single scene.
-
- Issues
-
- * Should SamplePatternSGIS be eliminated? Does anyone use this feature?
-
- * Should GLX_SAMPLE_BUFFERS_SGIS and SAMPLE_BUFFERS_SGIS be eliminated?
- Given the current specification, applications that query only
- GLX_SAMPLES_SGIS will be written, taking zero to mean that there is
- no multisample buffer.
-
- New Procedures and Functions
-
- void SampleMaskSGIS(clampf value,
- boolean invert);
-
- void SamplePatternSGIS(enum pattern);
-
- New Tokens
-
- Accepted by the <attribList> parameter of glXChooseVisual, and by the
- <attrib> parameter of glXGetConfig:
-
- GLX_SAMPLE_BUFFERS_SGIS
- GLX_SAMPLES_SGIS
-
- Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and
- by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
- GetDoublev:
-
- MULTISAMPLE_SGIS
- SAMPLE_ALPHA_TO_MASK_SGIS
- SAMPLE_ALPHA_TO_ONE_SGIS
- SAMPLE_MASK_SGIS
-
- Accepted by the <mask> parameter of PushAttrib:
-
- MULTISAMPLE_BIT_EXT (bit 29)
-
- Accepted by the <pattern> parameter of SamplePatternSGIS:
-
- 1PASS_SGIS
- 2PASS_0_SGIS
- 2PASS_1_SGIS
- 4PASS_0_SGIS
- 4PASS_1_SGIS
- 4PASS_2_SGIS
- 4PASS_3_SGIS
-
- Accepted by the <pname> parameter of GetBooleanv, GetDoublev,
- GetIntegerv, and GetFloatv:
-
- SAMPLE_BUFFERS_SGIS
- SAMPLES_SGIS
- SAMPLE_MASK_VALUE_SGIS
- SAMPLE_MASK_INVERT_SGIS
- SAMPLE_PATTERN_SGIS
-
- Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)
-
- None
-
- Additions to Chapter 3 of the 1.0 Specification (Rasterization)
-
- If SAMPLE_BUFFERS_SGIS is one, the rasterization of all GL primitives
- is changed, and is referred to as multisample rasterization. Otherwise
- primitive rasterization operates as it is described in the GL
- specification, and is referred to as single-sample rasterization. The
- value of SAMPLE_BUFFERS_SGIS is an implementation dependent constant, and
- is queried by calling GetIntegerv with <pname> set to SAMPLE_BUFFERS_SGIS.
-
- During multisample rendering the contents of a pixel fragment are
- changed in two ways. First, each fragment includes a coverage mask
- with SAMPLES_SGIS bits. The value of SAMPLES_SGIS is an implementation
- dependent constant, and is queried by calling GetIntegerv with <pname>
- set to SAMPLES_SGIS. Second, each fragment includes SAMPLES_SGIS depth
- values, instead of the single depth value that is maintained in
- single-sample rendering mode. Each pixel fragment thus consists of
- integer x and y grid coordinates, a color, SAMPLES_SGIS depth values,
- texture coordinates, a coverage value, and the SAMPLES_SGIS-bit mask.
-
- The behavior of multisample rasterization is a function of
- MULTISAMPLE_SGIS, which is enabled and disabled by calling Enable or
- Disable, with <cap> set to MULTISAMPLE_SGIS. Its value is queried using
- IsEnabled, with <cap> set to MULTISAMPLE_SGIS.
-
- If MULTISAMPLE_SGIS is disabled, multisample rasterization of all
- primitives is equivalent to single-sample rasterization, except that the
- fragment coverage mask is set to all ones. The depth values may all
- be set to the single value that would have been assigned by single-sample
- rasterization, or they may be assigned as described below for
- MULTISAMPLE_SGIS-enabled multisample rasterization.
-
- If MULTISAMPLE_SGIS is enabled, multisample rasterization of all
- primitives differs substantially from single-sample rasterization.
- It is understood that each pixel in the framebuffer has SAMPLES_SGIS
- locations associated with it. These locations are exact positions,
- rather than regions or areas, and each is referred to as a sample point.
- The sample points associated with a pixel may be located inside or
- outside of the unit square that is considered to bound the pixel.
- Furthermore, the pattern (relative location) of sample points may
- be identical for each pixel in the framebuffer, or it may differ.
-
- The locations of the sample points are relatively static; they change
- only when SamplePatternSGIS is called, as a repeatable function of
- parameter <pattern>. The default pattern 1PASS_SGIS is designed to
- produce a well antialiased result in a single rendering pass. Patterns
- 2PASS_0_SGIS and 2PASS_1_SGIS together specify twice the number of
- sample points per pixel. It is intended that a scene be completely
- rendered using pattern 2PASS_0_SGIS, then completely rendered again
- using 2PASS_1_SGIS. When these two images are averaged using the
- accumulation buffer, the result is as if a single pass had been
- rendered with a filter of twice SAMPLES_SGIS sample points. Patterns
- 4PASS_0_SGIS, 4PASS_1_SGIS, 4PASS_2_SGIS, and 4PASS_3_SGIS together define
- a pattern of four times SAMPLES_SGIS sample points. They can be used
- to accumulate an image after four complete rendering passes. It is
- not possible to query the actual sample locations of a pixel. The
- sample pattern mode is queried by calling GetIntegerv with <pname>
- set to SAMPLE_PATTERN_SGIS. By default the sample pattern is 1PASS_SGIS.
-
- If the sample patterns differ per pixel, they should be aligned to
- window, not screen, boundaries. Otherwise rendering results will be
- window-position specific. The invariance requirement described
- in section 3.1 is relaxed for all enabled multisample rendering,
- because the sample patterns may be a function of pixel location.
-
- 3.3.2 Point Multisample Rasterization
-
- If MULTISAMPLE_SGIS is enabled, and SAMPLE_BUFFERS_SGIS is one, then
- points are rasterized using the following algorithm, regardless of
- whether point antialiasing (POINT_SMOOTH) is enabled or disabled.
- Point rasterization produces a fragment for each framebuffer pixel
- with one or more sample points that intersect the region lying within
- the circle having diameter equal to the current point width and
- centered at the point's (Xw,Yw). The coverage value for each fragment
- is 1. Mask bits that correspond to sample points that intersect the
- circular region are 1, other mask bits are 0. All depth values of the
- fragment are assigned the depth value of the point being rasterized.
- The data associated with each fragment are otherwise the data
- associated with the point being rasterized.
-
- Point size range and number of gradations are equivalent to those
- supported for antialiased points.
-
- 3.4.4 Line Multisample Rasterization
-
- If MULTISAMPLE_SGIS is enabled, and SAMPLE_BUFFERS_SGIS is one, then
- lines are rasterized using the following algorithm, regardless of
- whether line antialiasing (LINE_SMOOTH) is enabled or disabled. Line
- rasterization produces a fragment for each framebuffer pixel with one
- or more sample points that intersect the rectangular region that is
- described in the Antialiasing section of 3.4.2 (Other Line Segment
- Features). If line stippling is enabled, the rectangular region is
- subdivided into adjacent unit-length rectangles, with some rectangles
- eliminated according to the procedure given under Line Stipple, where
- "fragment" is replaced by "rectangle".
-
- The coverage value for each fragment is 1. Mask bits that correspond
- to sample points that intersect a retained rectangle are 1, other mask
- bits are 0. Each depth value is produced by substituting the
- corresponding sample location into equation 3.1, then using the
- result to evaluate equation 3.3. The data associated with each
- fragment are otherwise computed by evaluating equation 3.1 at the
- fragment center, then substituting into equation 3.2.
-
- Line width range and number of gradations are equivalent to those
- supported for antialiased lines.
-
- 3.5.6 Polygon Multisample Rasterization
-
- If MULTISAMPLE_SGIS is enabled, and SAMPLE_BUFFERS_SGIS is one, then
- polygons are rasterized using the following algorithm, regardless of
- whether polygon antialiasing (POLYGON_SMOOTH) is enabled or disabled.
- Polygon rasterization produces a fragment for each framebuffer pixel
- with one or more sample points that satisfy the point sampling
- criteria described in section 3.5.1, including the special treatment
- for sample points that lie on a polygon boundary edge. If a polygon
- is culled, based on its orientation and the CullFace mode, then no
- fragments are produced during rasterization. Fragments are culled
- by the polygon stipple just as they are for aliased and antialiased
- polygons.
-
- The coverage value for each fragment is 1. Mask bits that correspond
- to sample points that satisfy the point sampling criteria are 1, other
- mask bits are 0. Each depth value is produced by substituting the
- corresponding sample location into the barycentric equations described
- in section 3.5.1, using the approximation to equation 3.4 that omits
- w components. The data associated with each fragment are otherwise
- computed by barycentric evaluation using the fragment's center point.
-
- The rasterization described above applies only to the FILL state of
- PolygonMode. For POINT and LINE, the rasterizations described in
- 3.3.2 (Point Multisample Rasterization) and 3.4.4 (Line Multisample
- Rasterization) apply.
-
- 3.6.4 Multisample Rasterization of Pixel Rectangles
-
- If MULTISAMPLE_SGIS is enabled, and SAMPLE_BUFFERS_SGIS is one, then
- pixel rectangles are rasterized using the following algorithm.
- Let (Xrp,Yrp) be the current raster position. (If the current raster
- position is invalid, then DrawPixels is ignored.) If a particular
- group (index or components) is the nth in a row and belongs to the
- mth row, consider the region in window coordinates bounded by the
- rectangle with corners
-
- (Xrp + Zx*n, Yrp + Zy*m)
-
- and
-
- (Xrp + Zx*(n+1), Yrp + Zy*(m+1))
-
- where Zx and Zy are the pixel zoom factors specified by PixelZoom,
- and may each be either positive or negative. A fragment representing
- group n,m is produced for each framebuffer pixel with one or more
- sample points that lie inside, or on the bottom or left boundary, of
- this rectangle. Each fragment so produced takes its associated data
- from the group and from the current raster position, in a manner
- consistent with SGIX_pixel_texture (if it is implemented) or in a
- manner consistent with the discussion in the Conversion to Fragments
- subsection of section 3.6.3 of the GL specification. All depth
- sample values are assigned the same value, taken either from the
- group (if it is a depth component group) or from the current raster
- position (if it is not).
-
- A single pixel rectangle will generate multiple, perhaps very many
- fragments for the same framebuffer pixel, depending on the pixel zoom
- factors.
-
- 3.7.1 Bitmap Multisample Rasterization
-
- If MULTISAMPLE_SGIS is enabled, and SAMPLE_BUFFERS_SGIS is one, then
- bitmaps are rasterized using the following algorithm. If the current
- raster position is invalid, the bitmap is ignored. Otherwise, a
- screen-aligned array of pixel-size rectangles is constructed, with its
- lower-left corner at (Xrp,Yrp), and its upper right corner at
- (Xrp+w,Yrp+h), where w and h are the width and height of the bitmap.
- Rectangles in this array are eliminated if the corresponding bit in the
- bitmap is zero, and are retained otherwise. Bitmap rasterization
- produces a fragment for each framebuffer pixel with one or more sample
- points either inside or on the bottom or left edge of a retained
- rectangle.
-
- The coverage value for each fragment is 1. Mask bits that correspond
- to sample points either inside or on the bottom or left edge of a
- retained rectangle are 1, other mask bits are 0. The associated data
- for each fragment are those associated with the current raster
- position. Once the fragments have been produced, the current raster
- position is updated exactly as it is in the single-sample rasterization
- case.
-
- Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
- and the Frame Buffer)
-
- 4.1.2.5 Multisample Fragment Operations
-
- [This section follows section 4.1.2 (Scissor test) and precedes section
- 4.1.3 (Alpha test)]
-
- This step modifies fragment alpha and mask values, based on the values
- of SAMPLE_ALPHA_TO_MASK_SGIS, SAMPLE_ALPHA_TO_ONE_SGIS, SAMPLE_MASK_SGIS,
- SAMPLE_MASK_VALUE_SGIS, and SAMPLE_MASK_INVERT_SGIS. No changes to the
- fragment alpha or mask values are made at this step if MULTISAMPLE_SGIS
- is disabled, or if SAMPLE_BUFFERS_SGIS is zero.
-
- SAMPLE_ALPHA_TO_MASK_SGIS, SAMPLE_ALPHA_TO_ONE_SGIS, and SAMPLE_MASK_SGIS
- are enabled and disabled by calling Enable and Disable with <cap>
- specified as one of the three token values. All three values are
- queried by calling IsEnabled, with <cap> set to the desired token value.
- If SAMPLE_ALPHA_TO_MASK_SGIS is enabled, the fragment alpha value is
- used to generate a temporary mask value, which is then ANDed with the
- fragment mask value. Otherwise the fragment mask value is unchanged at
- this point.
-
- This specification does not require a specific algorithm for converting
- an alpha value to a temporary mask value. It is intended that the number
- of 1's in the temporary mask be proportional to the alpha value, with
- all 1's corresponding to the maximum alpha value, and all 0's
- corresponding to an alpha value of 0. It is also intended that the
- algorithm be pseudo-random in nature, to avoid image artifacts due
- to regular mask patterns. The algorithm can and probably should be
- different at different pixel locations. If it does differ, it should
- be defined relative to window, not screen, coordinates, so that
- rendering results are invariant with respect to window position.
-
- Next, if SAMPLE_ALPHA_TO_ONE_SGIS is enabled, fragment alpha is replaced
- by the maximum representable alpha value. Otherwise, fragment alpha
- value is not changed.
-
- Finally, if SAMPLE_MASK_SGIS is enabled, the fragment mask is ANDed
- with another temporary mask. This temporary mask is generated in the
- same manner as the one described above, but as a function of the value
- of SAMPLE_MASK_VALUE_SGIS. The function need not be identical, but it
- must have the same properties of proportionality and invariance. If
- SAMPLE_MASK_INVERT_SGIS is TRUE, the temporary mask is inverted (all
- bit values are inverted) before it is ANDed with the fragment mask.
-
- The values of SAMPLE_MASK_VALUE_SGIS and SAMPLE_MASK_INVERT_SGIS are
- specified simultaneously by calling SampleMaskSGIS, with <value> set
- to the desired mask value, and <invert> set to TRUE or FALSE. <value>
- is clamped to [0,1] before being stored as SAMPLE_MASK_VALUE_SGIS.
- SAMPLE_MASK_VALUE_SGIS is queried by calling GetFloatv with <pname> set
- to SAMPLE_MASK_VALUE_SGIS. SAMPLE_MASK_INVERT_SGIS is queried by calling
- GetBooleanv with <pname> set to SAMPLE_MASK_INVERT_SGIS.
-
- 4.1.9 Multisample Fragment Operations
-
- If the DrawBuffers mode is NONE, no change is made to any multisample
- or color buffer. Otherwise, fragment processing is as described below.
-
- If MULTISAMPLE_SGIS is enabled, and SAMPLE_BUFFERS_SGIS is one, the
- stencil test, depth test, blending, and dithering operations described
- in sections 4.1.4, 4.1.5, 4.1.6, and 4.1.7 are performed for each
- pixel sample, rather than just once for each fragment. Failure
- of the stencil or depth test results in termination of the processing
- of that sample, rather than discarding of the fragment. All operations
- are performed on the color, depth, and stencil values stored in the
- multisample buffer (to be described in a following section). The
- contents of the color buffers are not modified at this point.
-
- Stencil, depth, blending, and dithering operations are performed
- for a pixel sample only if that sample's fragment mask bit is 1. If
- the corresponding mask bit is 0, no operations are performed for that
- sample. Depth operations use the fragment depth value that is
- specific to each sample. The single fragment color value is used for
- all sample operations, however, as is the current stencil value.
-
- If MULTISAMPLE_SGIS is disabled, and SAMPLE_BUFFERS_SGIS is one, the
- fragment may be treated exactly as described above, with optimization
- possible because the fragment mask must be all 1's. Further
- optimization is allowed, however. An implementation may choose to
- identify a centermost sample, and to perform stencil and depth tests
- on only that sample. Regardless of the outcome of the stencil test,
- all multisample buffer stencil sample values are set to the appropriate
- new stencil value. If the depth test passes, all multisample buffer
- depth sample values are set to the depth of the fragment's centermost
- sample's depth value, and all multisample buffer color sample values
- are set to the color value of the incoming fragment. Otherwise, no
- change is made to any multisample buffer color or depth value.
-
- After all operations have been completed on the multisample buffer,
- the color sample values are combined to produce a single color value,
- and that value is written into each color buffer that is currently
- enabled, based on the DrawBuffers mode. The method of combination is
- not specified, though a simple average computed independently for each
- color component is recommended.
-
- 4.2.2.5 Fine Control of Multisample Buffer Updates
-
- When SAMPLE_BUFFERS_SGIS is one, ColorMask, DepthMask, and StencilMask
- control the modification of values in the multisample buffer. The
- color mask has no effect on modifications to the color buffers. If
- the color mask is entirely disabled, the color sample values must
- still be combined (as described above) and the result used to replace
- the color values of the buffers enabled by DrawBuffers.
-
- 4.2.3.5 Clearing the Multisample Buffer
-
- The color samples of the multisample buffer are cleared when one or
- more color buffers are cleared, as specified by the Clear mask bit
- COLOR_BUFFER_BIT and the DrawBuffers mode. If the DrawBuffers mode is
- NONE, the color samples of the multisample buffer cannot be cleared.
-
- Clear mask bits DEPTH_BUFFER_BIT and STENCIL_BUFFER_BIT indicate that
- the depth and stencil samples of the multisample buffer are to be
- cleared. If Clear mask bit DEPTH_BUFFER_BIT is specified, and if
- the DrawBuffers mode is not NONE, then the multisample depth buffer
- samples are cleared. Likewise, if Clear mask bit STENCIL_BUFFER_BIT
- is specified, and if the DrawBuffers mode is not NONE, then the
- multisample stencil buffer is cleared.
-
- 4.3.2 Reading Pixels
-
- [These changes are made to the text in section 4.3.2, following the
- subheading Obtaining Pixels from the Framebuffer.]
-
- Follow the sentence "If there is no depth buffer, the error
- INVALID_OPERATION occurs." with: If there is a multisample buffer
- (SAMPLE_BUFFERS_SGIS is 1) then values are obtained from the depth
- samples in this buffer. It is recommended that the depth value
- of the centermost sample be used, though implementations may choose
- any function of the depth sample values at each pixel.
-
- Follow the sentence "if there is no stencil buffer, the error
- INVALID_OPERATION occurs." with: If there is a multisample buffer,
- then values are obtained from the stencil samples in this buffer.
- It is recommended that the stencil value of the centermost sample
- be used, though implementations may choose any function of the stencil
- sample values at each pixel.
-
- This extension makes no change to the way that color values are
- obtained from the framebuffer.
-
- Additions to Chapter 5 of the 1.0 Specification (Special Functions)
-
- None
-
- Additions to Chapter 6 of the 1.0 Specification (State and State Requests)
-
- An additional group of state variables, MULTISAMPLE_BIT_SGIS, is defined
- by this extension. When PushAttrib is called with bit MULTISAMPLE_BIT_SGIS
- set, the multisample group of state variables is pushed onto the
- attribute stack. When PopAttrib is called, these state variables are
- restored to their previous values if they were pushed. Some multisample
- state is included in the ENABLE_BIT group as well. In order to avoid
- incompatibility with GL implementations that do not support
- SGIS_multisample, ALL_ATTRIB_BITS does not include MULTISAMPLE_BIT_SGIS.
-
- Additions to the GLX Specification
-
- The parameter GLX_SAMPLE_BUFFERS_SGIS is added to glXGetConfig. When
- queried, by calling glXGetConfig with <attrib> set to
- GLX_SAMPLE_BUFFERS_SGIS, it returns the number of multisample buffers
- included in the visual. For a normal visual, the return value is zero.
- A return value of one indicates that a single multisample buffer is
- available. The number of samples per pixel is queried by calling
- glXGetConfig with <attrib> set to GLX_SAMPLES_SGIS. It is understood
- that the number of color, depth, and stencil bits per sample in the
- multisample buffer are as specified by the GLX_*_SIZE parameters. It
- is also understood that there are no single-sample depth or stencil
- buffers associated with this visual -- the only depth and stencil
- buffers are those in the multisample buffer. GLX_SAMPLES_SGIS is zero
- if GLX_SAMPLE_BUFFERS_SGIS is zero.
-
- glXChooseVisual accepts GLX_SAMPLE_BUFFERS_SGIS in <attribList>,
- followed by the minimum number of multisample buffers that can be
- accepted. Visuals with the smallest number of multisample buffers
- that meets or exceeds the specified minimum number are preferred.
- Currently operation with more than one multisample buffer is undefined,
- so the returned value will be either zero or one.
-
- glXChooseVisual accepts GLX_SAMPLES_SGIS in <attribList>, followed by
- the minimum number of samples that can be accepted in the multisample
- buffer. Visuals with the smallest number of samples that meets or
- exceeds the specified minimum number are preferred.
-
- If the color samples in the multisample buffer store fewer bits than
- are stored in the color buffers, this fact will not be reported
- accurately. Presumably a compression scheme is being employed, and is
- expected to maintain an aggregate resolution equal to that of the
- color buffers.
-
- Dependencies on SGIX_pixel_texture
-
- As described in the text in section 3.6.4, located in the Rasterization
- section of this document.
-
- Errors
-
- INVALID_ENUM is generated if SamplePatternSGIS parameter <pattern> is
- not 1PASS_SGIS, 2PASS_0_SGIS, 2PASS_1_SGIS, 4PASS_0_SGIS, 4PASS_1_SGIS,
- 4PASS_2_SGIS, or 4PASS_3_SGIS.
-
- INVALID_OPERATION is generated if SampleMaskSGIS or SamplePatternSGIS
- is called between the execution of Begin and the execution of the
- corresponding End.
-
- New State
-
- Get Value Get Command Type Initial Value Attribute
- --------- ----------- ---- ------------- ---------
- MULTISAMPLE_SGIS IsEnabled B TRUE multisample/enable
- SAMPLE_ALPHA_TO_MASK_SGIS IsEnabled B FALSE multisample/enable
- SAMPLE_ALPHA_TO_ONE_SGIS IsEnabled B FALSE multisample/enable
- SAMPLE_MASK_SGIS IsEnabled B FALSE multisample/enable
- SAMPLE_MASK_VALUE_SGIS GetFloatv R+ 1 multisample
- SAMPLE_MASK_INVERT_SGIS GetBooleanv B FALSE multisample
- SAMPLE_PATTERN_SGIS GetIntegerv Z7 1PASS_SGIS multisample
-
- New Implementation Dependent State
-
- Get Value Get Command Type Minimum Value
- --------- ----------- ---- -------------
- SAMPLE_BUFFERS_SGIS GetIntegerv Z+ 0
- SAMPLES_SGIS GetIntegerv Z+ 0
-